/**
 * 
 */
package fr.gfi.agraf.service.mapper;

import java.util.ArrayList;
import java.util.List;

import org.springframework.util.CollectionUtils;

import fr.gfi.agraf.persistence.entity.Activite;
import fr.gfi.agraf.persistence.entity.Perimetre;
import fr.gfi.agraf.persistence.entity.Saisie;
import fr.gfi.agraf.persistence.entity.Tache;
import fr.gfi.agraf.service.enumeration.EtatEnum;
import fr.gfi.agraf.vue.bean.PerimetreDTO;

/**
 * @author eleve
 * 
 */
public class PerimetreMapper {

	/**
	 * Constructeur
	 */
	private PerimetreMapper() {
		// Empty constructeur
	}

	/**
	 * Convertit une entity en dto
	 * 
	 * @param perimetre
	 * @return
	 */
	public static PerimetreDTO entityToDto(final Perimetre perimetre) {
		final PerimetreDTO perimetreDTO = new PerimetreDTO();
		perimetreDTO.setId(perimetre.getId());
		perimetreDTO.setDateCreation(perimetre.getDateCreation());
		perimetreDTO.setDateDebut(perimetre.getDateDebut());
		perimetreDTO.setDateFin(perimetre.getDateFin());
		perimetreDTO.setLibelle(perimetre.getLibelle());
		perimetreDTO.setEtatDTO(EtatMapper.entityToDto(perimetre.getEtat()));
		perimetreDTO.setModifiable(!EtatEnum.TERMINE.equals(EtatEnum.getEtatEnumById(perimetre.getEtat()
				.getId())));
		perimetreDTO.setSupprimable(EtatEnum.CREE.equals(EtatEnum
				.getEtatEnumById(perimetre.getEtat().getId()))
				&& CollectionUtils.isEmpty(perimetre.getActiviteSet()));
		calculerAvancementPerimetre(perimetre, perimetreDTO);
		final List<Activite> activiteList = new ArrayList<Activite>(perimetre.getActiviteSet());
		perimetreDTO.setListeActivite(ActiviteMapper.getListeDTO(activiteList, perimetreDTO));
		return perimetreDTO;
	}

	/**
	 * Convertit une liste entity en dto
	 * 
	 * @param perimetreList
	 * @return
	 */
	public static List<PerimetreDTO> entityToDTOList(final List<Perimetre> perimetreList) {
		final List<PerimetreDTO> perimetreDTOList = new ArrayList<PerimetreDTO>();
		if (!CollectionUtils.isEmpty(perimetreList)) {
			for (final Perimetre perimetre : perimetreList) {
				perimetreDTOList.add(entityToDto(perimetre));
			}
		}
		return perimetreDTOList;

	}

	/**
	 * renvoie le taux d'avancement d'un périmétre
	 * 
	 * @param perimetre
	 * @return
	 */
	private static void calculerAvancementPerimetre(final Perimetre perimetre,
			final PerimetreDTO perimetreOutput) {
		// Je récupére la charge initiale de toutes les taches terminées d'un
		// périmetre et le total des charges intiales
		double sommeChargeInitTerminee = 0;
		double sommeChargeInitTotale = 0;
		double sommeConsommeTotal = 0;
		double sommeRafTotal = 0;
		for (final Activite activite : perimetre.getActiviteSet()) {
			for (final Tache tache : activite.getTacheSet()) {
				sommeChargeInitTotale += tache.getChargeInit();
				if (tache.getEtat().getId().equals(EtatEnum.TERMINE.getId())) {
					sommeChargeInitTerminee += tache.getChargeInit();
				}
				double result = 0D;
				Saisie lastSaisie = null;
				if (!CollectionUtils.isEmpty(tache.getListeSaisies())) {
					for (final Saisie saisie : tache.getListeSaisies()) {
						if (lastSaisie == null) {
							lastSaisie = saisie;
						} else if (lastSaisie.getDate().before(saisie.getDate())) {
							lastSaisie = saisie;
						}
						result += saisie.getConsomme();
					}
					sommeRafTotal += lastSaisie.getRaf();
				}
				sommeConsommeTotal += result;

			}
		}

		perimetreOutput.setChargeInitTotale(sommeChargeInitTotale);
		perimetreOutput.setPourcentAvancement((int) (sommeChargeInitTerminee / sommeChargeInitTotale * 100));
		perimetreOutput.setRafTotal(sommeRafTotal);
		perimetreOutput.setConsommeTotal(sommeConsommeTotal);

		if (perimetreOutput.getEtatDTO().getId().equals(EtatEnum.CREE.getId())) {
			perimetreOutput.setProductiviteEstimee(0);
		} else {
			perimetreOutput.setProductiviteEstimee((int) (sommeChargeInitTotale
					/ (sommeConsommeTotal + sommeRafTotal) * 100));
		}
	}
}
